using System;

namespace TypeConversionApplication
{
    /*
        类型转换是将一个数据类型的值转换为另一个数据类型的过程
        C#中类型转换分为两种：隐式类型转换和显式类型转换(强制类型转换)
        隐式类型转换:
            由编译器自动进行，将范围较小的数据类型转换为较大的数据类型
            注：编译器会自动将byte类型转换为int类型，不需要显式转换
    */

    public class Fahrenheit
    {
        public double Degress { get; set; }

        public Fahrenheit(double degress)
        {
            Degress = degress;
        }

        // 隐式转换从Fahreheit到double
        public static implicit operator double(Fahrenheit f)
        {
            return f.Degress;
        }

        // 显示转换从double到Fahrenheit
        public static explicit operator Fahrenheit(double d)
        {
            return new Fahrenheit(d);
        }
    }


    class ExecuteTypeConversion
    {   
        /*
        static void Main(string[] args)
        {
            // 隐式转换
            byte b1 = 10;
            int i1 = b1;
            Console.WriteLine("发生隐式转换: byte:{0}, int:{1}", b1, i1);

            int intValue1 = 42;
            long longValue1 = intValue1;
            Console.WriteLine("发生隐式转换: int:{0}, long:{1}", intValue1, longValue1);

            // 显示转换
            int i2 = 10;
            byte b2 = (byte)i2;
            Console.WriteLine("发生显式转换: int:{0}, byte:{1}", i2, b2);

            double doubleValue2 = 3.14;
            int intValue2 = (int)doubleValue2;
            Console.WriteLine("发生显式转换: double:{0}, int:{1}", doubleValue2, intValue2);

            int intValue3 = 42;
            float floatValue3 = (float)intValue3;
            Console.WriteLine("发生显式转换: int:{0}, float:{1}", intValue3, floatValue3);

            int intValue4 = 123;
            string stringValue = intValue4.ToString();
            Console.WriteLine("发生显式转换: int:{0}, string:{1}", intValue4, stringValue);

            // C# 类型转换方法 System.Convert
            // 提供了一种安全的方式来执行类型转换 可处理null值，当转换不可进行时会抛出异常
            string str1 = "123";
            int number1 = Convert.ToInt32(str1);
            Console.WriteLine("Convert工具类进行类型转换: str{0} to int{1}", str1, number1);

            int i3 = 75;
            float f1 = 53.005f;
            double d = 2345.7652;
            bool b = true;

            Console.WriteLine(i3.ToString());
            Console.WriteLine(f1.ToString());
            Console.WriteLine(d.ToString());
            Console.WriteLine(d.ToString());

            
             隐式转换只能将较小范围的数据类型转换为较大范围的数据类型, 不能将较大范围的数据类型转换为较小范围的数据类型;
             显式转换可能会导致数据丢失或精度降低, 需要进行数据类型的兼容性检查;
             对于对象类型的转换, 需要进行类型转换的兼容检查和类型转换的安全性检查
            

            // 多种类型转换方法 Convert类, Parse方法, TryParse方法
            string str2 = "123.45";
            double d2 = double.Parse(str2);
            Console.WriteLine("Parse方法转换：{0}", d2);

            string str3 = "123.45";
            double d3;
            bool success = double.TryParse(str3, out d3);
            if (success)
            {
                Console.WriteLine("转换成功：" + d);
            }
            else
            {
                Console.WriteLine("转换失败");
            }

            // 自定义转换
            Fahrenheit f = new Fahrenheit(98.6);
            Console.WriteLine("Fahrenheit object: " + f.Degress + " degress");

            double temp = f;
            Console.WriteLine("After implicit conversion to double: " + temp + "degress");

            Fahrenheit newF = (Fahrenheit)f;
            Console.WriteLine("After explicit conversion back to Fahrenheit: " + newF.Degress + " degress");
        }
        */
    }
}